<?php

namespace Profiel\Model;

class Bijwerken {
    private $_gegevens = [];
    private $_boodschap = '';
    private $_foutenLijst = [];
    private $_json = ['resultaat'=>true, 'boodschap'=>''];
    private $_dbVerbinding = null;
    private $_validatie = null;
    
    public function bijwerken() {
        $this->_gegevens = $_POST;
        
        if (!is_array($this->_gegevens)) {
            $this->_json['resultaat'] = false;
            $this->_json['boodschap'] = 'Geen data';
            return $this->_json;
        }
        
        $this->_validatie = new \Validatie();
        
        $this->_dbVerbinding = \db::GET();
        $this->_dbVerbinding->beginTransaction();
        
        $this->_bijwerkenPersoon();
        $this->_bijwerkenAdres();
        $this->_bijwerkenWachtwoord();
        $this->_bijwerkenFoto();
        
        if ($this->_json['resultaat']) {
            $this->_dbVerbinding->commit();
        } else {
            $this->_dbVerbinding->rollback();
        }
        
        if (count($this->_foutenLijst) > 0) {
            $lijst  = '<p>Controleer volgende velden op fouten...</p><ul><li>';
            $lijst .= implode('</li><li>',$this->_foutenLijst);
            $lijst .= '</li></ul>';
            $this->_json['boodschap'] = $lijst;
        }
        
        return $this->_json;
    }
    
    private function _bijwerkenPersoon() {
        $this->_gegevens['naam'] = trim($this->_gegevens['naam']);
        if (!$this->_validatie->tekst($this->_gegevens['naam'],2)) {
            array_push($this->_foutenLijst,'naam');
            $this->_json['resultaat'] = false;
        }
        
        $this->_gegevens['voornaam'] = trim($this->_gegevens['voornaam']);
        if (!$this->_validatie->tekst($this->_gegevens['voornaam'],2)) {
            array_push($this->_foutenLijst,'voornaam');
            $this->_json['resultaat'] = false;
        }
        
        $this->_gegevens['initialen'] = trim($this->_gegevens['initialen']);
        
        $this->_gegevens['email'] = trim($this->_gegevens['email']);
        if (!$this->_validatie->email($this->_gegevens['email'])) {
            array_push($this->_foutenLijst,'e-mail');
            $this->_json['resultaat'] = false;
        }
        
        $datum = explode('-',$this->_gegevens['geborenop']);
        // zet datum van formaat d-m-Y naar Y-m-d
        $datum = array_reverse($datum);
        $datum = implode('-',$datum);
        $this->_gegevens['geborenop'] = $datum;
        if (!$this->_validatie->datum($datum)) {
            array_push($this->_foutenLijst,'datum onjuist');
            $this->_json['resultaat'] = false;
        } else {
            $datum = new \DateTime($datum);
            $datumRef = new \DateTime(date('Y-m-d'));
            $verschil = $datum->diff($datumRef)->format('%R%a');
            if ($verschil <= 0) {
                array_push($this->_foutenLijst,'datum niet toeglaten, je moet reeds geboren zijn');
                $this->_json['resultaat'] = false;    
            }
        }
        
        $this->_gegevens['mobiel'] = trim($this->_gegevens['mobiel']);
        
        if (!$this->_json['resultaat']) {
            return;
        }
        
        $dbSql = "UPDATE persoon SET 
                  aanhef=:aanhef, naam=:naam, voornaam=:voornaam, initialen=:initialen, geborenop=:geborenop, email=:email, mobiel=:mobiel
                  WHERE id=:idpersoon";
        try {
            $dbStmt = $this->_dbVerbinding->prepare($dbSql);
            $dbStmt->execute([':aanhef'=>$this->_gegevens['aanhef'],
                              ':naam'=>$this->_gegevens['naam'],
                              ':voornaam'=>$this->_gegevens['voornaam'],
                              ':initialen'=>$this->_gegevens['initialen'],
                              ':geborenop'=>$this->_gegevens['geborenop'],
                              ':email'=>$this->_gegevens['email'],
                              ':mobiel'=>$this->_gegevens['mobiel'],
                              ':idpersoon'=>$_SESSION['persoonid']]);
        } catch (PDOException $ex) {
            $this->_json['resultaat'] = false;
        }
    }
    
    private function _bijwerkenFoto() {
        if (isset($_FILES['foto'])) {
            $upload = new \Upload();
            if ($bestand = $upload->upload('foto',\Instelling::GET('profiel.mime'),\Instelling::GET('profiel.map'))) {
                $bestand = str_replace(DIRECTORY_SEPARATOR,'/',$bestand);
                try {                    
                    $dbSql = "UPDATE persoon SET foto=:foto WHERE id=:idpersoon";
                    $dbStmt = $this->_dbVerbinding->prepare($dbSql);
                    $dbStmt->execute([':foto'=>$bestand,':idpersoon'=>$_SESSION['persoonid']]);
                    $this->_json['foto'] = \Instelling::GET('website.root').$bestand;
                    
                } catch (PDOException $ex) {
                    $this->_json['resultaat'] = false;
                }
            } else {
                array_push($this->_foutenLijst,'fout uploaden foto: '.$upload->getBoodschap());
                $this->_json['resultaat'] = false;
            } 
        }
    }
    
    private function _bijwerkenAdres() {
        $dbSql = "DELETE FROM persoonadres WHERE idpersoon=:idpersoon";
        try {
            $dbStmt = $this->_dbVerbinding->prepare($dbSql);            
            $dbStmt->execute([':idpersoon'=>$_SESSION['persoonid']]);
        } catch (PDOException $ex) {

        }
        
        if (filter_var($this->_gegevens['h_adres'],FILTER_VALIDATE_BOOLEAN)) {
            if ($adres = $this->_bijwerkenAdresValideer('H')) {
                $this->_bijwerkenAdresBewaar($adres);
                
                if (filter_var($this->_gegevens['d_adres'],FILTER_VALIDATE_BOOLEAN)) {
                    if ($adres = $this->_bijwerkenAdresValideer('D')) {
                        $this->_bijwerkenAdresBewaar($adres);
                    } else {
                        $this->_json['resultaat'] = false;
                        array_push($this->_foutenLijst,'Leveradres niet correct');
                    }
                }
            } else {
                $this->_json['resultaat'] = false;
                array_push($this->_foutenLijst,'Huisadres niet correct');
            }
        }
        
        if (filter_var($this->_gegevens['w_adres'],FILTER_VALIDATE_BOOLEAN)) {
            if ($adres = $this->_bijwerkenAdresValideer('W')) {
                $this->_bijwerkenAdresBewaar($adres);
            } else {
                $this->_json['resultaat'] = false;
                array_push($this->_foutenLijst,'Adres werk niet correct');
            }
        }
    }
    
    private function _bijwerkenAdresValideer($soort = '') {
         $adres = [];
         
         $adres['soort'] = $soort;
         $type = strtolower($soort).'_';
         foreach(['straat','nummer','bus','postcode','gemeente','land'] as $item) {
             $tmp = $type.$item;
             $adres[$item] = trim($this->_gegevens[$tmp]);
         }
         
         if (empty($adres['straat']) || empty($adres['nummer']) || empty($adres['postcode']) || empty($adres['gemeente'])) {
             return false;
         }
         
         return $adres;
    }
    
    private function _bijwerkenAdresBewaar($adres) {
        $dbSql = "INSERT INTO persoonadres(soort,idpersoon,straat,nummer,bus,gemeente,postcode,land) 
                  VALUES (:soort,:idpersoon,:straat,:nummer,:bus,:gemeente,:postcode,:land)";
        try {
            $dbStmt = $this->_dbVerbinding->prepare($dbSql);
            $dbStmt->execute([':idpersoon'=>$_SESSION['persoonid'],
                              ':soort'=>$adres['soort'],
                              ':straat'=>$adres['straat'],
                              ':nummer'=>$adres['nummer'],
                              ':bus'=>$adres['bus'],
                              ':postcode'=>$adres['postcode'],
                              'gemeente'=>$adres['gemeente'],
                              ':land'=>$adres['land']]);
        } catch (PDOException $ex) {
            array_push($this->_foutenLijst,'Fout bij bewaren adres');
            $this->_json['resultaat'] = false; 
        }
    }
    
    private function _bijwerkenWachtwoord() {
        $w8wHuidig = trim($this->_gegevens['w8w_huidig']);
        $w8wNieuw = trim($this->_gegevens['w8w_nieuw']);
        $w8wBevestig = trim($this->_gegevens['w8w_bevestig']);
        
        if (strlen($w8wNieuw) == 0) {
            return;
        }
        
        if (preg_match("/^[a-zA-Z0-9?_\-]{8,}$/",$w8wNieuw)) {
            $g = preg_replace('/[^A-Z]/','',$w8wNieuw);
            $k = preg_replace('/[^a-z]/','',$w8wNieuw);
            $c = preg_replace('/[^0-9]/','',$w8wNieuw);
            if (strlen($g) > 1 && strlen($k) > 1 && strlen($c) > 1) {
                try {
                    $dbSql = "SELECT wachtwoord FROM persoon WHERE id=:idpersoon";
                    $dbStmt = $this->_dbVerbinding->prepare($dbSql);
                    $dbStmt->execute([':idpersoon'=>$_SESSION['persoonid']]);                    
                    $dbWachtwoord = $dbStmt->fetch(\PDO::FETCH_ASSOC)['wachtwoord'];
                    if ($dbWachtwoord == sha1($w8wHuidig)) {
                        $dbSql = "UPDATE persoon SET wachtwoord=:w8w WHERE id=:idpersoon";
                        $dbStmt = $this->_dbVerbinding->prepare($dbSql);
                        $dbStmt->execute(['w8w'=>sha1($w8wNieuw),
                                          ':idpersoon'=>$_SESSION['persoonid']]);
                    } else {
                        array_push($this->_foutenLijst,'Huidig wachtwoord is foutief');
                        $this->_json['resultaat'] = false; 
                    }
                } catch (PDOException $ex) {

                }
            } else {
                array_push($this->_foutenLijst,'2-wachtwoord bestaat uit 8 of meer karakters A-Za-z0-9?_- waarvan minstens 2 hoofdletters, 2 kleine letters en 2 cijfers');
                $this->_json['resultaat'] = false; 
            }
        } else {
            array_push($this->_foutenLijst,'1-wachtwoord bestaat uit 8 of meer karakters A-Za-z0-9?_- waarvan minstens 2 hoofdletters, 2 kleine letters en 2 cijfers');
            $this->_json['resultaat'] = false;
        }
    }
}
